package com.example.musicapp.base;

import com.example.musicapp.network.HttpResponseListener;

import java.lang.ref.WeakReference;


import java.lang.reflect.Proxy;

public class BasePresenter<V extends IBaseView> implements IBasePresenter, HttpResponseListener {
    private WeakReference<V> mViewWRef;
    private V mProxyView;
    public BasePresenter(V view) {
        attachView(view);
    }

    /**
     * 想用弱引用键绑定相应的view对象
     * @param view 传入的相应的view接口对像
     */
    public void attachView(V view) {


        mViewWRef = new WeakReference<V>(view);
        // 用代理对象
        mProxyView = (V) Proxy.newProxyInstance(view.getClass().getClassLoader(), view.getClass().getInterfaces(), (proxy, method, args) -> {
            // 执行这个方法 ，调用的是被代理的对象
            if(!isViewAttach()) {
                return null;
            }
            // 没解绑执行的是原始被代理 View 的方法
            return method.invoke(mViewWRef.get(),args);
        });
    }

    /**
     * 得到相应的view层弱引用对象
     * @return 返回相应的view弱引用对象
     */
    public V getView() {
        if (mViewWRef!= null){
            return mViewWRef.get();
        }

        return null;
    }


    @Override
    public boolean isViewAttach() {
        return mViewWRef != null && mViewWRef.get() != null;
    }

    @Override
    public void detachView() {
        if (mViewWRef != null) {
            mViewWRef.clear();
            mViewWRef = null;
        }
    }

    @Override
    public void onSuccess(Object tag) {
    }

    @Override
    public void onFailure(Object tag, Object failure) {
    }
}
